package com.szwistar.common.comm;

import java.net.SocketAddress;

import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * 通信客户端（通信端点）基类
 * 1) 服务器(Acceptor)被动 accept 进来的每一个 session 对应一个本地客户端
 * 2) 本地(Connector)主动 connect 到的每个通信对象，也对应一个本地客户端
 */
public interface CommEndpoint {
	/**
	 * 获得对客户端对应的 session
	 */
    IoSession getSession();

	/**
	 * 是否已连接
	 */
    boolean isConnected();

	/**
	 * 主动关闭本客户端连接
	 */
    void close();

	/**
	 * 获得本端地址
	 */
    SocketAddress getLocalAddress();

	/**
	 * 获得对端地址
	 */
    SocketAddress getPeerAddress();

	/**
	 * 发送数据
	 */
    WriteFuture write(Object message);

	//
	// 事件处理
	//
    void onCreate(IoSession session, Object context) throws Exception;

    void onOpened() throws Exception;

	void onClosed() throws Exception;

	void onMessageReceived(Object message) throws Exception;

	void onMessageSent(Object message) throws Exception;

	void onIdle(IdleStatus status) throws Exception;

	void onExceptionCaught(Throwable cause) throws Exception;
}
